<!DOCTYPE html>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
  <meta charset="utf-8">
  

  
  <title>【feign】不支持在Get请求中使用对象传参 | wiki</title>
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <meta name="description" content="解决方法：  改用 POST  改用 Map  自定义 Encoder  @see feign-request-object @see https://github.com/OpenFeign/feign/issues/520    一点延伸 quote: https://source.coveo.com/2016/07/21/feign-request-object/    1234567891">
<meta name="keywords" content="feign,spring-cloud">
<meta property="og:type" content="article">
<meta property="og:title" content="【feign】不支持在Get请求中使用对象传参">
<meta property="og:url" content="https://jpcui.github.io/wiki/2018/11/05/【feign】不支持在Get请求中使用对象传参/index.html">
<meta property="og:site_name" content="wiki">
<meta property="og:description" content="解决方法：  改用 POST  改用 Map  自定义 Encoder  @see feign-request-object @see https://github.com/OpenFeign/feign/issues/520    一点延伸 quote: https://source.coveo.com/2016/07/21/feign-request-object/    1234567891">
<meta property="og:locale" content="default">
<meta property="og:updated_time" content="2019-02-12T12:16:19.942Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="【feign】不支持在Get请求中使用对象传参">
<meta name="twitter:description" content="解决方法：  改用 POST  改用 Map  自定义 Encoder  @see feign-request-object @see https://github.com/OpenFeign/feign/issues/520    一点延伸 quote: https://source.coveo.com/2016/07/21/feign-request-object/    1234567891">
  
    <link rel="alternate" href="/wiki/atom.xml" title="wiki" type="application/atom+xml">
  
  
    <link rel="icon" href="/favicon.png">
  
  
    <link href="//fonts.googleapis.com/css?family=Source+Code+Pro" rel="stylesheet" type="text/css">
  
  <link rel="stylesheet" href="//cdn.bootcss.com/font-awesome/4.3.0/css/font-awesome.min.css">
  <link rel="stylesheet" href="/wiki/css/style.css">
</head>
</html>
<body>
  <div id="container">
    <div id="wrap">
      <header id="header">
    <div id="banner"></div>
    <div id="header-outer" class="outer">
        <div id="header-title" class="inner">
            <h1 id="logo-wrap">
                <a href="/wiki/" id="logo">wiki</a>
            </h1>
            
                <h2 id="subtitle-wrap">
                    <a href="/wiki/" id="subtitle">just like a wiki</a>
                </h2>
            
        </div>
        <div id="header-inner" class="inner">
            <nav id="main-nav">
                <a id="main-nav-toggle" class="nav-icon"></a>
                
                    <a class="main-nav-link" href="/wiki/">Home</a>
                
                    <a class="main-nav-link" href="/wiki/archives">Archives</a>
                
            </nav>
            <nav id="sub-nav">
                
                    <a id="nav-rss-link" class="nav-icon" href="/wiki/atom.xml" title="RSS Feed"></a>
                
                <a id="nav-search-btn" class="nav-icon" title="Search"></a>
            </nav>
            <div id="search-form-wrap">
                <form action="//google.com/search" method="get" accept-charset="UTF-8" class="search-form"><input type="search" name="q" class="search-form-input" placeholder="Search"><button type="submit" class="search-form-submit">&#xF002;</button><input type="hidden" name="sitesearch" value="https://jpcui.github.io/wiki"></form>
            </div>
        </div>
    </div>
</header>
      <div class="outer">
        <section id="main"><article id="post-【feign】不支持在Get请求中使用对象传参" class="article article-type-post" itemscope="" itemprop="blogPost">
    <div class="article-meta">
        <div class="left">
            <a href="/wiki/2018/11/05/【feign】不支持在Get请求中使用对象传参/" class="article-date">
  <time datetime="2018-11-05T07:11:52.000Z" itemprop="datePublished">2018-11-05</time>
</a>
            
        </div>
        <div class="right">
            <span class="article-date right">
                <i class="fa fa-comments">
                    <a href="https://github.com/JPCui/wiki/issues/new" target="_blank" class="widget-title">issue</a>
                </i>
                <i class="fa fa-eye">
                    <span id="busuanzi_value_page_pv"></span>
                </i>
            </span>
        </div>
    </div>
    <div class="article-inner">
        
        
            <header class="article-header">
                
    
        <h1 class="article-title" itemprop="name">
            【feign】不支持在Get请求中使用对象传参
        </h1>
    

            </header>
        
        <div class="article-entry" itemprop="articleBody">
            
                <p>解决方法：</p>
<ol>
<li><p>改用 POST</p>
</li>
<li><p>改用 Map</p>
</li>
<li><p>自定义 Encoder</p>
<ul>
<li>@see <a href="feign-request-object.md">feign-request-object</a></li>
<li>@see <a href="https://github.com/OpenFeign/feign/issues/520" target="_blank" rel="noopener">https://github.com/OpenFeign/feign/issues/520</a></li>
</ul>
</li>
</ol>
<h3 id="一点延伸"><a href="#一点延伸" class="headerlink" title="一点延伸"></a>一点延伸</h3><blockquote>
<p>quote: <a href="https://source.coveo.com/2016/07/21/feign-request-object/" target="_blank" rel="noopener">https://source.coveo.com/2016/07/21/feign-request-object/</a></p>
</blockquote>
  <figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br></pre></td><td class="code"><pre><span class="line">Using request objects with Feign</span><br><span class="line">BY JONATHAN ROCHETTE — JULY 21, 2016</span><br><span class="line">We recently decided to move our functional tests stack from python to Java, mainly to make coding them easier (our project’s backend is coded in Java) and thus increase the number of tests getting written. We needed a few things to make this possible and one of them was a complete and comprehensive Java client for the Usage Analytics API. Since a lot of the Java API clients we use internaly are built with Netflix’s Feign, I decided to give it a go.</span><br><span class="line"></span><br><span class="line">After playing with Feign a little, I started to really like the tool. Writing an HTTP client with it is pretty easy, and it would not be a lot of work to maintain. I only had one major concern: there was no out of the box support for request objects.</span><br><span class="line"></span><br><span class="line">Using request objects is a simple pattern that help maintain methods with many optional parameters, which is the case for some our API’s methods. Without request objects, calling a method would look like this:</span><br><span class="line"></span><br><span class="line">statsApi.getCombinedData(from,</span><br><span class="line">                         to,</span><br><span class="line">                         dimensions,</span><br><span class="line">                         metrics,</span><br><span class="line">                         null,</span><br><span class="line">                         null,</span><br><span class="line">                         null,</span><br><span class="line">                         null,</span><br><span class="line">                         true,</span><br><span class="line">                         null,</span><br><span class="line">                         null,</span><br><span class="line">                         null);</span><br><span class="line">Not looking so good, right? Using a request object transforms the method call into this:</span><br><span class="line"></span><br><span class="line">statsApi.getCombinedData(new GetCombinedDataRequest(from,</span><br><span class="line">                                                    to,</span><br><span class="line">                                                    dimensions,</span><br><span class="line">                                                    metrics)</span><br><span class="line">                         .withIncludeMetadata(true));</span><br><span class="line">Way better!</span><br><span class="line"></span><br><span class="line">For the request objects, we settled for a constructor that would take the required parameters of the API call in arguments. The optional parameters can then be added to the request with setters or via the fluent interface pattern.</span><br><span class="line"></span><br><span class="line">So, this is all very nice, but it does not fix my initial concern with Feign. I have some really nice request objects, but I cannot use any of them, as they are not supported. But, since Feign is very easily extendable, I simply added support for the request objects via a homemade encoder. And thus, the ReflectionEncoder was born.</span><br><span class="line"></span><br><span class="line">public class ReflectionEncoder implements Encoder</span><br><span class="line">&#123;</span><br><span class="line">    private static final String DEFAULT_DATETIME_FORMAT = &quot;yyyy-MM-dd&apos;T&apos;HH:mm:ss.SSSZZ&quot;;</span><br><span class="line">    private ObjectMapper mapper;</span><br><span class="line">    private Encoder fallbackEncoder;</span><br><span class="line"></span><br><span class="line">    public ReflectionEncoder(ObjectMapper mapper,</span><br><span class="line">                             Encoder fallbackEncoder)</span><br><span class="line">    &#123;</span><br><span class="line">        this.mapper = mapper;</span><br><span class="line">        this.fallbackEncoder = fallbackEncoder;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    public void encode(Object parametersObject, Type bodyType, RequestTemplate template)</span><br><span class="line">      throws EncodeException &#123;</span><br><span class="line">      if (Request.class.isAssignableFrom(parametersObject.getClass())) &#123;</span><br><span class="line">        Map&lt;String, Object&gt; params = new HashMap&lt;&gt;();</span><br><span class="line">        try &#123;</span><br><span class="line">          // Prepare the requestTemplate</span><br><span class="line">          for (Method method : parametersObject.getClass().getMethods()) &#123;</span><br><span class="line">            if (method.isAnnotationPresent(QueryParam.class)) &#123;</span><br><span class="line">              String key = method.getAnnotation(QueryParam.class).value();</span><br><span class="line">              Object value = method.invoke(parametersObject);</span><br><span class="line">              if (value != null) &#123;</span><br><span class="line">                if (Collection.class.isAssignableFrom(method.getReturnType())) &#123;</span><br><span class="line">                  value =</span><br><span class="line">                      ((Collection&lt;?&gt;) value)</span><br><span class="line">                          .stream()</span><br><span class="line">                          .map(v -&gt; String.valueOf(v))</span><br><span class="line">                          .collect(Collectors.toList());</span><br><span class="line">                &#125; else if (DateTime.class.isAssignableFrom(method.getReturnType())) &#123;</span><br><span class="line">                  value = ((DateTime) value).toString(DEFAULT_DATETIME_FORMAT);</span><br><span class="line">                &#125; else &#123;</span><br><span class="line">                  value = String.valueOf(value);</span><br><span class="line">                &#125;</span><br><span class="line">                params.put(key, value);</span><br><span class="line">                template.query(key, keyToTemplate(key));</span><br><span class="line">              &#125;</span><br><span class="line">            &#125; else if (method.isAnnotationPresent(PathParam.class)) &#123;</span><br><span class="line">              String key = method.getAnnotation(PathParam.class).value();</span><br><span class="line">              Object value = method.invoke(parametersObject);</span><br><span class="line">              if (value != null) &#123;</span><br><span class="line">                params.put(key, String.valueOf(value));</span><br><span class="line">              &#125;</span><br><span class="line">            &#125; else if (method.isAnnotationPresent(BodyParam.class)) &#123;</span><br><span class="line">              template.body(mapper.writeValueAsString(method.invoke(parametersObject)));</span><br><span class="line">            &#125;</span><br><span class="line">          &#125;</span><br><span class="line"></span><br><span class="line">          // Replace templates with actual values</span><br><span class="line">          template.resolve(params);</span><br><span class="line">        &#125; catch (</span><br><span class="line">            IllegalAccessException</span><br><span class="line">            | IllegalArgumentException</span><br><span class="line">            | InvocationTargetException</span><br><span class="line">            | JsonProcessingException e) &#123;</span><br><span class="line">          throw new EncodeException(&quot;Could not encode parameter object correctly&quot;, e);</span><br><span class="line">        &#125;</span><br><span class="line">      &#125; else &#123;</span><br><span class="line">        fallbackEncoder.encode(parametersObject, bodyType, template);</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    private String keyToTemplate(String key)</span><br><span class="line">    &#123;</span><br><span class="line">        return &quot;&#123;&quot; + key + &quot;&#125;&quot;;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">It may look complicated, but it’s in fact pretty simple. Here is how it works: if the object received by the encoder is of the right type, it will use reflection to find the getters of the object, and depending on the annotation, inject the parameter at the right place in the RequestTemplate. Otherwise, it will use a fallback encoder.</span><br><span class="line"></span><br><span class="line">Now, simply set the ReflectionEncoder in your client class with the builder provided by Feign and you are ready to go!</span><br><span class="line"></span><br><span class="line">Here is a complete example of a simple client using request objects.</span><br><span class="line"></span><br><span class="line">public interface CustomDimensionsApi extends ClientFactory.Api</span><br><span class="line">&#123;</span><br><span class="line">    @RequestLine(&quot;PUT /&quot; + ApiVersion.VERSION + &quot;/dimensions/custom/&#123;apiName&#125;&quot;)</span><br><span class="line">    DimensionResponse editDimension(EditDimensionRequest request);</span><br><span class="line">&#125;</span><br><span class="line">public class EditDimensionRequest extends BaseRequest</span><br><span class="line">&#123;</span><br><span class="line">    private String apiName;</span><br><span class="line">    private Boolean updatePastEvents;</span><br><span class="line">    private CustomDimensionModel customDimensionModel;</span><br><span class="line"></span><br><span class="line">    public EditDimensionRequest(String apiName,</span><br><span class="line">                                CustomDimensionModel customDimensionModel)</span><br><span class="line">    &#123;</span><br><span class="line">        this.apiName = apiName;</span><br><span class="line">        this.customDimensionModel = customDimensionModel;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    @PathParam(&quot;apiName&quot;)</span><br><span class="line">    public String getApiName() &#123; return apiName; &#125;</span><br><span class="line">    public void setApiName(String apiName) &#123; this.apiName = apiName; &#125;</span><br><span class="line"></span><br><span class="line">    @QueryParam(&quot;updatePastEvents&quot;)</span><br><span class="line">    public Boolean getUpdatePastEvents() &#123; return updatePastEvents; &#125;</span><br><span class="line">    public void setUpdatePastEvents(Boolean updatePastEvents) &#123; this.updatePastEvents = updatePastEvents; &#125;</span><br><span class="line"></span><br><span class="line">    @BodyParam</span><br><span class="line">    public CustomDimensionModel getCustomDimensionModel() &#123; return customDimensionModel; &#125;</span><br><span class="line">    public void setCustomDimensionModel(CustomDimensionModel customDimensionModel) &#123; this.customDimensionModel = customDimensionModel; &#125;</span><br><span class="line"></span><br><span class="line">    public EditDimensionRequest withUpdatePastEvents(Boolean updatePastEvents)&#123;</span><br><span class="line">        setUpdatePastEvents(updatePastEvents); return this;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line">There you have it: a very simple HTTP client built with Feign, using a request object. It made coding our functional tests way easier and made them much cleaner. The next steps for us would be to combine that with better exception handling (awesome post by my friend Jacques-Etienne Beaudet, go check it out) and we would be unstoppable!</span><br></pre></td></tr></table></figure>
            
        </div>
        <footer class="article-footer">
            <a data-url="https://jpcui.github.io/wiki/2018/11/05/【feign】不支持在Get请求中使用对象传参/" data-id="cjs5isuzs0009iuuia9b2u9rz" class="article-share-link">Share</a>
            
            
  <ul class="article-tag-list"><li class="article-tag-list-item"><a class="article-tag-list-link" href="/wiki/tags/feign/">feign</a></li><li class="article-tag-list-item"><a class="article-tag-list-link" href="/wiki/tags/spring-cloud/">spring-cloud</a></li></ul>

        </footer>
    </div>
    
        
    <nav id="article-nav">
        
            <a href="/wiki/2018/11/05/【guava】EventBus/" id="article-nav-newer" class="article-nav-link-wrap">
                <strong class="article-nav-caption">Newer</strong>
                <div class="article-nav-title">
                    
                        【guava】EventBus
                    
                </div>
            </a>
        
        
            <a href="/wiki/2018/11/05/【hystrix】探索/" id="article-nav-older" class="article-nav-link-wrap">
                <strong class="article-nav-caption">Older</strong>
                <div class="article-nav-title">【hystrix】探索</div>
            </a>
        
    </nav>

    
</article>

</section>
        
          <aside id="sidebar">
  
    

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tags</h3>
    <div class="widget">
      <ul class="tag-list"><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/beego/">beego</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/bootstrap/">bootstrap</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/consul/">consul</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/docker/">docker</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/elastic-job/">elastic-job</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/eventbus/">eventbus</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/feign/">feign</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/fileinput/">fileinput</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/git/">git</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/golang/">golang</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/guava/">guava</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/hikari/">hikari</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/mgo/">mgo</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/mybatis/">mybatis</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/php/">php</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/redis/">redis</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/spring/">spring</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/spring-boot/">spring-boot</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/spring-cloud/">spring-cloud</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/spring-data/">spring-data</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/服务架构/">服务架构</a></li><li class="tag-list-item"><a class="tag-list-link" href="/wiki/tags/项目管理/">项目管理</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Tag Cloud</h3>
    <div class="widget tagcloud">
      <a href="/wiki/tags/beego/" style="font-size: 10px;">beego</a> <a href="/wiki/tags/bootstrap/" style="font-size: 10px;">bootstrap</a> <a href="/wiki/tags/consul/" style="font-size: 10px;">consul</a> <a href="/wiki/tags/docker/" style="font-size: 12.5px;">docker</a> <a href="/wiki/tags/elastic-job/" style="font-size: 10px;">elastic-job</a> <a href="/wiki/tags/eventbus/" style="font-size: 10px;">eventbus</a> <a href="/wiki/tags/feign/" style="font-size: 10px;">feign</a> <a href="/wiki/tags/fileinput/" style="font-size: 10px;">fileinput</a> <a href="/wiki/tags/git/" style="font-size: 10px;">git</a> <a href="/wiki/tags/golang/" style="font-size: 12.5px;">golang</a> <a href="/wiki/tags/guava/" style="font-size: 10px;">guava</a> <a href="/wiki/tags/hikari/" style="font-size: 10px;">hikari</a> <a href="/wiki/tags/mgo/" style="font-size: 10px;">mgo</a> <a href="/wiki/tags/mybatis/" style="font-size: 10px;">mybatis</a> <a href="/wiki/tags/php/" style="font-size: 10px;">php</a> <a href="/wiki/tags/redis/" style="font-size: 10px;">redis</a> <a href="/wiki/tags/spring/" style="font-size: 10px;">spring</a> <a href="/wiki/tags/spring-boot/" style="font-size: 15px;">spring-boot</a> <a href="/wiki/tags/spring-cloud/" style="font-size: 20px;">spring-cloud</a> <a href="/wiki/tags/spring-data/" style="font-size: 10px;">spring-data</a> <a href="/wiki/tags/服务架构/" style="font-size: 10px;">服务架构</a> <a href="/wiki/tags/项目管理/" style="font-size: 17.5px;">项目管理</a>
    </div>
  </div>

  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Archives</h3>
    <div class="widget">
      <ul class="archive-list"><li class="archive-list-item"><a class="archive-list-link" href="/wiki/archives/2019/02/">February 2019</a></li><li class="archive-list-item"><a class="archive-list-link" href="/wiki/archives/2018/11/">November 2018</a></li></ul>
    </div>
  </div>


  
    
  <div class="widget-wrap">
    <h3 class="widget-title">Recent Posts</h3>
    <div class="widget">
      <ul>
        
          <li>
            <a href="/wiki/2019/02/12/todolist/">todolist</a>
          </li>
        
          <li>
            <a href="/wiki/2018/11/05/【spring-cloud】spring-cloud-config/">【spring-cloud】spring-cloud-config</a>
          </li>
        
          <li>
            <a href="/wiki/2018/11/05/【bootstrap】file-input/">【bootstrap】file-input</a>
          </li>
        
          <li>
            <a href="/wiki/2018/11/05/【docker】杀不死的docker/">【docker】杀不死的docker</a>
          </li>
        
          <li>
            <a href="/wiki/2018/11/05/【docker】创建java容器/">【docker】创建java容器</a>
          </li>
        
      </ul>
    </div>
  </div>

  
</aside>
        
      </div>
      <footer id="footer">
    
    <div class="outer">
        <div id="footer-info" class="left alignleft">
            &copy; 2019 Sucre Cui
            <br>
            Powered by <a href="http://hexo.io/" target="_blank">Hexo</a>
        </div>
        <div class="right alignright">
            <span id="busuanzi_container_site_pv">
                <i class="fa fa-eye" title="PV"></i> <span id="busuanzi_value_site_pv"><i class="fa fa-spinner"></i></span>
                <br>
                <i class="fa fa-user" title="UV"></i> <span id="busuanzi_value_site_uv"></span>
            </span>
            <script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
        </div>
    </div>
</footer>
    </div>
    <nav id="mobile-nav">
  
    <a href="/wiki/" class="mobile-nav-link">Home</a>
  
    <a href="/wiki/archives" class="mobile-nav-link">Archives</a>
  
</nav>
    

<script src="//cdn.bootcss.com/jquery/2.0.3/jquery.min.js"></script>


  <link rel="stylesheet" href="/wiki/fancybox/jquery.fancybox.css">
  <script src="/wiki/fancybox/jquery.fancybox.pack.js"></script>


<script src="/wiki/js/script.js"></script>



  </div>
</body>
</html>